package com.chorye.function.pdf.read.service;

import com.chorye.function.pdf.read.entity.Student;
import com.chorye.function.pdf.read.mapper.StudentMapper;
import com.chorye.function.pdf.read.utils.BeanUtil;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Company: 北京XXXX有限公司
 * @Author JiangYy
 * @Title: PdfReadService
 * @Description: pdf导入
 * @Date 2019/7/22 14:55
 */
@Service
public class PdfReadService {
    /**
     * 学生mapper
     */
    @Autowired
    private StudentMapper studentMapper;

    /**
     * 导入pdf文件中的数据
     *
     * @param file 文件
     */
    public void importPDF(MultipartFile file) {
        // 文件不为空才处理
        if (file != null && !file.isEmpty()) {
            try {
                // 读取文件
                PdfReader pdfReader = new PdfReader(file.getBytes());
                // 文件的页数
                int pages = pdfReader.getNumberOfPages();
                // 拼接
                StringBuffer buffer = new StringBuffer();
                // 遍历每一页，注意，1代表第一页，不是从0开始
                for (int i = 1; i <= pages; i++) {
                    // 将文件内容读为文本
                    buffer.append(PdfTextExtractor.getTextFromPage(pdfReader, i)).append("\n");

                }
                // 取出最终结果
                String result = buffer.toString();
                if (StringUtils.isNotBlank(result)) {
                    String[] rows = result.split("\n");
                    if (rows.length > 0) {
                        // 创建集合存储读取的数据
                        List<Student> students = new ArrayList<>();
                        // 假定表头行为 0
                        int headerLine = 0;
                        // 判断是否有空白行，如果有空白行则表头行下移
                        for (int i = 0; i < rows.length; i++) {
                            // 空白行
                            if (StringUtils.isBlank(rows[i])) {
                                // 表头行下移
                                headerLine++;
                            }
                        }
                        // 处理表格数据
                        for (int i = headerLine + 1; i < rows.length; i++) {
                            // 取出表格没一行的数据
                            String row = rows[i];
                            // 如果有数据
                            if (StringUtils.isNotBlank(row)) {
                                // 按照空格分割，得到每一列的值
                                String[] values = row.split(" ");
                                // 取出表头模板信息
                                String[] headers = resolveHeaders();
                                // 如果有表头并且表头的字段数和值的列数匹配
                                if (headers != null && values.length == headers.length) {
                                    // 创建学生实体
                                    Student student = new Student();
                                    // 遍历为每一个属性赋值
                                    for (int j = 0; j < headers.length; j++) {
                                        BeanUtil.setFieldValue(student, headers[j], String.class, values[j]);
                                    }
                                    students.add(student);
                                }
                            }
                        }
                        // 处理后的学生信息不为空则入库
                        if (!CollectionUtils.isEmpty(students)) {
                            studentMapper.insertBatch(students);
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 解析表头模板
     *
     * @return 表头信息
     */
    private String[] resolveHeaders() {
        PdfReader pdfReader;
        TextExtractionStrategy strategy;
        try {
            // 读取表头模板文件
            pdfReader = new PdfReader("C:\\Users\\new\\Desktop\\chorye\\pdf-test\\template.pdf");
            // 获取当前pdf页数
            int pages = pdfReader.getNumberOfPages();
            // 拼接字符串
            StringBuffer buffer = new StringBuffer();
            // 获取pdf读取的内容转换器
            PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader);
            // 循环处理每一页的内容，注意，1代表第一页，不是从0开始
            for (int i = 1; i <= pages; i++) {
                // 创建内容处理策略为：文本提取
                strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
                // 拼接文本内容
                buffer.append(strategy.getResultantText());
            }
            // 获取结果
            String headerStr = buffer.toString();
            // 如果表头不为空
            if (StringUtils.isNotBlank(headerStr)) {
                // 拆分头
                String[] headers = headerStr.split("\n");
                // 如果有值
                if (headers.length > 0) {
                    // 取出第一行的表头字段
                    String header = headers[1];
                    // 取到了
                    if (StringUtils.isNotBlank(header)) {
                        // 按照空格拆分
                        return header.split(" ");
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 任何不满足返回null
        return null;
    }

//    public static String extractPdfText(File file) throws Exception {
//        if (null == file || !file.exists()) {
//            return null;
//        }
//        FileInputStream is = new FileInputStream(file);
//        PDDocument pdfDocument = null;
//        String text = null;
//        try {
//            PDFTextStripper stripper = new PDFTextStripper();
//            pdfDocument = PDDocument.load(is);
//            StringWriter writer = new StringWriter();
//            stripper.writeText(pdfDocument, writer);
//            text = writer.getBuffer().toString();
//            if (null == text) {
//                return null;
//            }
//            text = text.trim();
//            is.close();
//        } catch (java.io.IOException ex) {
//            throw ex;
//        } finally {
//            if (pdfDocument != null) {
//                // org.pdfbox.cos.COSDocument cos = pdfDocument.getDocument();
//                // cos.close();
//                pdfDocument.close();
//            }
//        }
//        // 将所有空白替换为单个空格
//        Pattern blankPattern = Pattern.compile("\\s+|\t|\r|\n");
//        Matcher m = blankPattern.matcher(text);
//        String strNoBlank = m.replaceAll(" ");
//        return strNoBlank;
//    }
//    public static Map<String, String> extractParams(String filename, String text)
//            throws Exception {
//        if (StringUtils.isBlank(text)) {
//            return null;
//        }
//        Map<String, String> result = new LinkedHashMap<String, String>();
//        result.put("filename", filename);
//        // 报告编号
//        Matcher bgbhMatcher = REPORT_BASE_INFO_PATTERN_10.matcher(text);
//        int i = 1;
//        if (!bgbhMatcher.find()) {
//            throw new Exception("报告基本信息提取失败。");
//        } else {
//            for (int j = 0; j < list.size(); j++) {
//                if (text.contains(list.get(j))) {
//                    result.put(list.get(j), bgbhMatcher.group(i).replaceAll(
//                                                        " ", "").trim());
//                    i = i + 1;
//                } else {
//                    result.put(list.get(j), "null");
//                }
//            }
//        }
//        return result;
//    }
}
